package com.csdn.springbootmybatis.controller;

import com.alibaba.fastjson.JSON;
import com.csdn.springbootmybatis.RespStat;
import com.csdn.springbootmybatis.mode.Account;
import com.csdn.springbootmybatis.mode.Config;
import com.csdn.springbootmybatis.service.impl.AccountService;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.Assert;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;

/**
 * 用户帐号相关
 */
@Controller
@RequestMapping(value = "/account")
@Slf4j
public class AccountController {


    final static String fileRootPath = "/Users/tina/Pictures/";

    @Autowired
    private AccountService accountService;
    @Autowired
    Config config;

    @RequestMapping(value = "/login")
    public String login(Model model) {
        model.addAttribute("config", config);
        return "account/login";
    }

    @RequestMapping(value = "/validataAccount")
    @ResponseBody
    public String validataAccount(String loginName, String password, HttpServletRequest request){
        Account account = accountService.findByLoginNameAndPassword(loginName,password);
        if(account == null){
//            Assert.notNull(account,"用户不存在");
            return "用户名或密码不存在";  //页面上显示的提示错误应该说 写在html里的，这里的return 信息没啥用
        }else{
            // 登录成功
            // 写到Session里（那就要拿到session对象并调用它的方法，怎么拿session？ 肯定是通过HttpServletRequest来拿）
            // 在不同的controller 或者前端页面上 都能使用
            // 当前登录用户的Account对象
            request.getSession().setAttribute("account",account);
//            request.getSession().
            log.info("account={}",account);
            log.info("account.getLoginName={}",account.getLoginName());
            return "success";
        }
    }

    @RequestMapping("/logOut")
    public String logOut(HttpServletRequest request) {
        request.getSession().removeAttribute("account");
        return "/index";
    }

    @RequestMapping("/list")
    public String list(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "5" ) int pageSize, Model model) {
        PageInfo<Account> page = accountService.findByPage(pageNum, pageSize);
        log.info("带分页的返回 格式是：" + JSON.toJSONString(page));
        model.addAttribute("page", page);
        return "/account/list";
    }

    @RequestMapping("/deleteById")
    @ResponseBody
    public RespStat deleteById(int id) {
        // 标记一下 是否删除成功？  status
        RespStat stat = accountService.deleteById(id);
        return stat;
    }

    /**
     * 弹出上传头像的界面
     */
    @RequestMapping("/profile")
    public String profile () {
        return "account/profile";
    }

    /**
     * 上传文件 1、存文件到磁盘上 2、文件名存库里
     * @param filename  MultipartFile这个类重要
     */
    @RequestMapping("/fileUploadController")
    public String fileUpload (MultipartFile filename, String password, HttpServletRequest request) {
        /**
         * 注意这里有个坑，accountService.update(account); 更新的是哪条记录，这里没有唯一标识，怎么办呢？  有2个做法
         * 1、弹出profile页面的时候，把该记录的id放到隐藏域里去。 然后通过表单收集数据的方式拿到唯一标识。
         * 但是有安全性的问题：表单收集的id是伪造的 。  就是当前我这个用户去改了别人的头像和密码。
         * 2，就是从request.getSession()里拿当前用户。这个就不会出错，除非把cookie给伪造了。这个难度就大了
         */
        Account account = (Account)request.getSession().getAttribute("account");
        try {
            // 指定系统存放文件的目录，首先这个目录要存在，或者有创建目录的代码（嘿嘿）
            // transfer方法，文件已经转存，下面还要把文件名存到库里去。（只用存文件名就可以了）（上传的照片统一放到一个地方去撒）
            //filename如果重复，生成的文件重命名一下，后面加一个时间戳就行
            filename.transferTo(new File(fileRootPath + filename.getOriginalFilename()));

            account.setPassword(password);
            account.setLocation(filename.getOriginalFilename());
            accountService.update(account);
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "account/profile";
    }

}
